//copyright by lanxyou  lanxyou[at]gmail.com


var WebDB=function(dbname){
	var db=openDatabase(dbname,'1.0.0','',65536);
	return{
		//返回数据库名
		getDBName:function(){
			return dbname;
		},
		//初始化数据库，如果需要则创建表
		init:function(tableName,colums){
			this.switchTable(tableName);
			colums.length>0?this.createTable(colums):'';
			return this;
		},
		//创建表，colums:[name:字段名,type:字段类型]
		createTable:function(colums){
			var sql="CREATE TABLE IF NOT EXISTS " + this._table ;
			var t;
			if (colums instanceof Array && colums.length>0){
				t=[];
				for (var i in colums){
					t.push(colums[i].name+' '+colums[i].type);
				}
				t=t.join(', ');
			}else if(typeof colums=="object"){
				t+=colums.name+' '+colums.type;
			}
			sql=sql+" ("+t+")";
			var that=this;
			db.transaction(function (t) { 
				t.executeSql(sql) ;
            })
		},
		//切换表
		switchTable:function(tableName){
			this._table=tableName;
			return this;
		},
		//插入数据并执行回调函数，支持批量插入
		//data为Array类型，每一组值均为Object类型，每一个Obejct的属性应为表的字段名，对应要保存的值
		insertData:function(data,callback){
			var that=this;
			var sql="INSERT INTO "+this._table;
			if (data instanceof Array && data.length>0){
				var cols=[],qs=[];
				for (var i in data[0]){
					cols.push(i);
					qs.push('?');
				}
				sql+=" ("+cols.join(',')+") Values ("+qs.join(',')+")";
			}else{
				return false;
			}
			var p=[],
				d=data,
				pLenth=0,
				r=[];
			for (var i=0,dLength=d.length;i<dLength;i++){
				var k=[];
				for (var j in d[i]){
					k.push(d[i][j]);
				}
				p.push(k);
			}
			var queue=function(b,result){
				if (result){
					r.push(result.insertId ||result.rowsAffected);
				}
				if (p.length>0){
					db.transaction(function (t) { 
						t.executeSql(sql,p.shift(),queue,that.onfail);
					})
				}else{
					if (callback){
						callback.call(this,r);
					}
				}
			}
			queue();
		},
		_where:'',
		//where语句，支持自写和以对象属性值对的形式
		where:function(where){
			if (typeof where==='object'){
				var j=this.toArray(where);
				this._where=j.join(' and ');
			}else if (typeof where==='string'){
				this._where=where;
			}
			return this;
		},
		//更新数据，data为属性值对形式
		updateData:function(data,callback){
			var that=this;
			var sql="Update "+this._table;
			data=this.toArray(data).join(',');
			sql+=" Set "+data+" where "+this._where;
			this.doQuery(sql,callback);
		},
		//根据条件保存数据，如果存在则更新，不存在则插入数据
		saveData:function(data,callback){
			var sql="Select * from "+this._table+" where "+this._where;
			var that=this;
			this.doQuery(sql,function(r){
				if (r.length>0){
					that.updateData(data,callback);
				}else{
					that.insertData([data],callback);
				}
			});
		},
		//获取数据
		getData:function(callback){
			var that=this;
			var sql="Select * from "+that._table;
			that._where.length>0?sql+=" where "+that._where:"";
			that.doQuery(sql,callback);
		},
		//查询，内部方法
		doQuery:function(sql,callback){
			var that=this;
			var a=[];
			var bb=function(b,result){
				if (result.rows.length){
					for (var i=0;i<result.rows.length;i++){
						a.push(result.rows.item(i));
					}
				}else{
					a.push(result.rowsAffected);
				}
				if (callback){
					callback.call(that,a);
				}
			}
			db.transaction(function (t) { 
				t.executeSql(sql,[],bb,that.onfail) ;
			})
		},
		//根据条件删除数据
		deleteData:function(callback){
			var that=this;
			var sql="delete from "+that._table;
			that._where.length>0?sql+=" where "+that._where:'';
			that.doQuery(sql,callback);
		},
		//删除表
		dropTable:function(){
			var sql="DROP TABLE IF EXISTS "+this._table;
			this.doQuery(sql);
		},
		_error:'',
		onfail:function(t,e){
			this._error=e.message;
			console.log('----sqlite:'+e.message);
		},
		toArray:function(obj){
			var t=[];
			obj=obj || {};
			if (obj){
				for (var i in obj){
					t.push(i+"='"+obj[i]+"'");
				}
			}
			return t;
		}
	}
};



/*
examples:
var db=new lanxDB('testDB');
db.init('channel_list',[{name:'id',type:'integer primary key autoincrement'},{name:'name',type:'text'},{name:'link',type:'text'},{name:'cover',type:'text'},{name:'updatetime',type:'integer'},{name:'orders',type:'integer'}]);
db.init('feed_list',[{name:'parentid',type:'integer'},{name:'feed',type:'text'}]);
db.switchTable('channel_list').insertData([{name:'aa',link:'ss',updatetime:new Date().getTime()},{name:'bb',link:'kk',updatetime:new Date().getTime()}]);
db.where({name:'aa'}).getData(function(result){
	console.log(result);//result为Array
});
db.where({name:'aa'}).deleteData(function(result){
	console.log(result[0]);//删除条数
});
db.where({name:'bb'}).saveData({link:'jj'},function(result){
	console.log(result);//影响条数
})
})
*/